/**
 * 用户服务类
 */
package com.glela.platform.service;

import java.util.List;

import org.springframework.http.ResponseEntity;

import com.glela.common.exception.BusinessException;
import com.glela.common.exception.PlatformException;
import com.glela.platform.model.CRole;
import com.glela.platform.model.Guest;
import com.glela.platform.model.MyInvitationFriend;
import com.glela.platform.model.MyattentionTalent;
import com.glela.platform.model.User;
import com.glela.platform.model.UserGuest;
import com.glela.platform.model.UserInfo;
import com.glela.platform.model.UserJournal;
import com.glela.platform.model.UserLocatedInfo;
import com.glela.platform.model.request.RequestBaseModel;
import com.glela.platform.model.request.RequestGuest;
import com.glela.platform.model.request.RequestUserModel;
import com.glela.platform.model.request.RequsetPersonalInfo;
import com.glela.platform.model.response.MemberFeeAndTotalSale;
import com.glela.platform.model.response.ResponseMineInfoModel;
import com.glela.platform.model.response.ResponsePersonalInfoset;
import com.glela.platform.model.response.ResponseTeacher;
import com.glela.platform.model.response.ResponseUser;
import com.glela.platform.model.response.ResponseUserVo;

/**
 * @author liujie
 */
public interface UserService {

	/**
	 * 根据ID查询用户
	 * @param id
	 * @return User
	 */
	public User getUser(Long id);

	/**
	 * 根据用户名获取用户信息
	 * 
	 * @param userName
	 * @return
	 */
	public ResponseUser getUserByName(String userName);

	public User selectRecommendFromByUserId(Long id);

	public List<CRole> selectRoleByRoleType(Integer roleType);

	/**
	 * <dl>
	 * <dt>获取角色列表，排除某一角色</dt>
	 * </dl>
	 * @param roleType 角色类型
	 * @return List<CRole>
	 * @author zls
	 */
	public List<CRole> selectRoleByRoleTypeNot(Integer roleType);

	/**
	 * <dl>
	 * <dt>更新用户的普通推荐人身份</dt>
	 * </dl>
	 * @param list item.id 用户id
	 * @param list item.memberRecommend 会员推荐人用户id
	 * @return int
	 * @author zls
	 */
//	public int batchMemberRecommendById(List<User> list);

	public int batchUpdateMoney(List<UserJournal> list);

	
	/**
	 * <dl>
	 * <dt>用户详细信息</dt>
	 * </dl>
	 * @param userId 用户id
	 * @return UserInfo
	 * @author zls
	 */
	public UserInfo selectByUserId(Long userId);
	
	public ResponseUser selectUserRoleByPersonId(String personId);

	/**
	 * 退出登录
	 * 
	 * @param userId
	 * @return
	 */
	public int logOut(Long userId,String clientType);

	/**
	 * 用户注册
	 * 
	 * @param userModel
	 * @return
	 * @throws Exception
	 */
	public int saveRegister(RequestUserModel userModel) throws Exception;

	/**
	 * 获取签到活动开关值
	 * 
	 * @return 1：开启，0：关闭
	 */
	public int selectSigninFlag();

	/**
	 * 查询用户是否已被注册
	 * 
	 * @param mobilePhone
	 * @return
	 */
	public int selectUserIdByUserName(String mobilePhone);

	/**
	 * 查询用户头像
	 * 
	 * @param userId
	 * @return
	 */
	public ResponsePersonalInfoset selectUserPicture(Long userId);

	/**
	 * 用户登录
	 * 
	 * @param userModel
	 * @return
	 * @throws Exception
	 */
	public ResponseUser updateLogin(RequestUserModel userModel) throws Exception;

	/**
	 * 获取用户角色信息
	 * @param userId
	 *            用户ID
	 */
	public ResponseUser selectUserRoleById(long userId);

	/**
	 * 根据用户id减去花费的现金币（现金币必须大于等于当前已有现金币）
	 * @param id 用户id
	 * @param cashCoin 花费的现金币（本次要减去的现金币）
	 * @return 影响行数
	 */
	public int updateSubMoneyById(long id, long cashCoin);

	/**
	 * <dl>
	 * <dt>提升普通角色用户角色为会员</dt>
	 * </dl>
	 * @param userList item.id 用户id
	 * @return int
	 * @author zls
	 */
//	public int updateUpMemberInId(List<User> userList);

	/**
	 * <dl>
	 * <dt>更新用户身份id</dt>
	 * </dl>
	 * @param id 用户id
	 * @param recommendFrom 普通推荐人身份id
	 * @param talentTeacher 达人导师推荐人身份id
	 * @return int 更新条数
	 * @author zls
	 */
	public int updateOpenStoreInfoById(long id, String recommendFrom, String talentTeacher);

	/**
	 * 重置密码
	 * 
	 * @param userModel
	 * @return
	 */
	public ResponseUser updatePassword(RequestUserModel userModel);

	/**
	 * 修改密码
	 * 
	 * @param userModel
	 * @return
	 */
	public int updatePasswordByChange(RequestUserModel userModel);

	/**
	 * 绑定匿名用户
	 * 
	 * @param userId
	 * @return
	 */
	int bindGuestUser(Long userId, String guestCode);

	UserGuest getUserGuestByGuestId(Long guestId);

	/**
	 * 获取userId(若不存在UserId取匿名用户Id)
	 * 
	 * @param userId
	 * @param guestId
	 * @return
	 */
	Long queryUserId(RequestBaseModel model);

	/**
	 * 根据手机号查询用户id
	 * 
	 * @param PhoneNumber
	 * @return
	 */
	long selectUserIdByPhoneNumber(String PhoneNumber);

	/**
	 * 根据用户ID修改用户头像
	 * 
	 * @param picture
	 * @param userId
	 * @return
	 */
	boolean updateUserInfoset(RequsetPersonalInfo requsetPersonalInfo) throws Exception;

	/**
	 * 判断是否是新设备
	 * 
	 * @param deviceCode
	 * @return
	 */
	public boolean isNewDevice(String deviceCode);

	/**
	 * 判断是否是新用户
	 * 
	 * @param userId
	 * @return
	 */
	public boolean isNewUser(Long userId);

	/****** BEGIN getDeviceLink BY 2010309 liujie **********/
	/**
	 * 根据用户的guest_id获取设备信息
	 * 
	 * @param param
	 * @return
	 */
	String getDeviceLinkByGuestId(RequestGuest param);

	/**
	 * 更新设备信息
	 * 
	 * @param record
	 * @return
	 */
	int updateGuestInfo(Guest guest);

	/****** END getDeviceLink BY 20160309 liujie ************/

	/**
	 * 设置用户常驻地
	 * 
	 * @param userId
	 * @param areaCode
	 * @return
	 * @throws BusinessException
	 */
	int setUserLocated(long userId, String ip) throws BusinessException;

	/**
	 * 设置匿名用户常驻地
	 * 
	 * @param userId
	 * @param areaCode
	 * @return
	 * @throws BusinessException
	 */
	int setGuestLocated(Guest guest, String ip) throws BusinessException;

	/**
	 * 获取当前区域code
	 * 
	 * @param ip
	 * @return
	 * @throws PlatformException
	 */
	String getCurrentCode(String ip);

	/**
	 * 归档用户地理位置信息
	 * 
	 * @param userLocatedInfo
	 * @param currentCode
	 * @return
	 */
	int recordUserLocatedInfo(UserLocatedInfo userLocatedInfo, String currentCode);

	/**
	 * @param user
	 */
	public int updateUser(User user);

	/**
	 * 记录阿里反欺诈查询日志
	 * 
	 * @param mobile
	 * @param ip
	 * @param scene
	 * @param result
	 */
	public int insertIpQueryLog(String mobile, String ip, String scene, String result);

	/**
	 * 获取系统开关值
	 * 
	 * @param key
	 *            开关类型
	 * @return 1：开启，0：关闭
	 */
	public int selectFlag(String key);

	public ResponseMineInfoModel selectMineInfo(long userId, String clickDate);

	/**
	 * 修改用户money
	 * 
	 * @author 卫耀华
	 * @date 2016-10-05
	 * @param userId
	 * @param money
	 * @return
	 */
	public void updateUserInfonickMoneyById(long id, int money);

	/**
	 * 
	 * 根据用户id查询用户信息
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param er
	 * @return
	 */
	public User getUserEntityByIdNoPassword(long userId) throws Exception;

	/**
	 * 
	 * 用户注册
	 * 
	 * @author 程哲权
	 * @param regSource 
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int userRegistration(String userName, String password, String code, int regSource);

	/**
	 * 
	 * 修改密码
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int updateUserPasswordById(long userId, String password, String newPassword);

	/**
	 * 
	 * 忘记密码
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int updateUserPasswordByUserName(String userName, String password, String code);

	/**
	 * 
	 * 退出登录
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int updateUserLastLoginTime(long userId);

	/**
	 * 
	 * 我关注的达人
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public List<MyattentionTalent> selectPictureAndNickName(long userId, int page, int pageSize);

	/**
	 * 
	 * 推荐用户注册
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public ResponseEntity<?> updaterecommendUserRegister(String userName, String code, String recommendFrom, String nickName,
			String picture, int sex,String clientType);

	/**
	 * 
	 * 我邀请的好友列表
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public List<MyattentionTalent> selectUserByRecommendFrom(String recommendFrom, int page, int pageSize);

	/**
	 * 
	 * 我邀请的好友数量
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public MyInvitationFriend selectUserByRecommendFromCount(String recommendFrom);

	/**
	 * 我邀请的好友数量
	 * 
	 * @param recommendFrom
	 * @return
	 */
	public int selectInvitationNumByUserId(Long userId);

	/**
	 * 我的现金币
	 * 
	 * @param recommendFrom
	 * @return
	 */
	public int selectUserMoney(Long userId);

	/**
	 * 
	 * 根据用户id修改用户昵称
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int updateNickName(String nickName, long id);

	/**
	 * 
	 * 根据用户id修改用户头像
	 * 
	 * @author 程哲权
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public int updateUserPicture(String picture, long id);

	/**
	 * 
	 * 动态密码登录
	 * 
	 * @author 程哲权
	 * @param recommendFrom 
	 * @date 2016-10-05
	 * @param
	 * @return
	 */
	public ResponseUser dynamicRegister(String userName);

	/**
	 * 美妆咨询界面
	 * 
	 * @author 卫耀华
	 * @param pageLimit
	 * @param pageSize
	 * @return
	 */
	public List<ResponseUserVo> selectUserByRoleId7NoPassword(int pageLimit, int pageSize);

	/**
	 * 美妆咨询界面
	 * 
	 * @author 卫耀华
	 * @return
	 */
	public int countUserByRoleId7();

	/**
	 * 用户是否关注此达人
	 * 
	 * @author 卫耀华
	 * @param talentId
	 * @param userId
	 * @return
	 */
	public int userIsEnjoyThisTalent(Long talentId, Long userId);

	/**
	 * 达人主页邀请修改大人主页的背景图和达人简介
	 * 
	 * @author 卫耀华
	 * @param talentId
	 * @param talentDescription
	 * @param talentBackgroundImage
	 * @return
	 */
	public int updateUserJianjieAndBackgroundImageById(Long talentId, String talentDescription,
			String talentBackgroundImage);

	/**
	 * 查询用户的累计销售额度和会员价格
	 * 
	 * @author 卫耀华
	 * @param talentId
	 * @param userId
	 * @return
	 */
	public MemberFeeAndTotalSale selectMemberFeeAndTotalSale(long userId);

	public List<User> selectUserWhereUserNameIsNull();

//	public void cancelTalentQualification(List<User> userList);
	
	public UserInfo selectUserInfoByUserId(long userId);

	/**
	 * 校妆网~根据某用户的推荐人身份ID查询推荐人信息
	 * 
	 * @author 卫耀华
	 * @param persionId
	 * @return
	 */
	public UserInfo selectUserInfoByPersionId(String persionId);

	public int updateisOpenRecommandById(int isOpenRecommand, long id);

	/**
	 * 
	 * 方法用途：用于判断该用户是否购买过B区自营商品，且存在过单笔订单金额满360元且支付成功的记录，返回结果大于0，就满足，否则不满足
	 * 
	 * @author 卫耀华
	 * @date 2017-02-20
	 * @param userId
	 * @return
	 */
	public int countSingleOrderInfo(long userId);

	public ResponseEntity<?> webpageRegister(String userName, String code, String recommendFrom,String clientType);

	/**
	 * 用户是否关注讲师
	 * 
	 * @param userId
	 * @param talentId
	 * @return
	 */
	public int userIsEnjoyTalent(long userId, long talentId);
	
	public void selectUserInsert();

	/**
	 * 校妆四期  讲师搜索
	 * @param startIndex
	 * @param pageSize
	 * @param searchText
	 * @return
	 */
	public List<ResponseTeacher> searchTeacher(int startIndex, int pageSize, String searchText);
	
	/**
	 * 查询用户头上的讲述	 * @param userId
	 * @return
	 */
	public ResponseEntity<?> getUserTeacherInfo(long userId);

	/**
	 * <dl>
	 * <dt>计算用户当前角色</dt>
	 * </dl>
	 * @param userId 用户id
	 * @param roleId 用户现有角色id
	 * @author zls
	 * @date 2017年6月21日 下午4:36:48
	 */
	public void calculateUserRole(long userId,int roleId);
	
	
	/***
	 * 
	 * @param jobNo
	 * @return
	 */
	public User selectUserForTearch(String jobNo) ;

	/**
	 * <dl>
	 * <dt>查询校妆姐姐身份id</dt>
	 * <dd>使用BaseConstants.XZ_SISTER_PERSION_ID替换</dd>
	 * </dl>
	 * @return String
	 * @author zls
	 * @date 2017年8月23日 下午7:26:33
	 */
	@Deprecated
	public String getXzSisterPersion();

	/** 
	* @Title: resetUserPasswordByUserId 
	* @Description: 根据用户id重置密码
	* @param @param id
	* @param @param password
	* @param @return    设定文件 
	* @return int    返回类型 
	* @throws 
	* @author zhangrenjie 
	* @date 2017年8月14日 下午1:16:00 
	*/
	public int resetUserPasswordByUserId(Long id, String password);
	
	public int updateUserLoginInfo(User user);


	public void updateUserCacheByUserId(Long userId) ;
	

	public void updateUserCacheByUserName(String userName) ;
	
	public void cacheUserPersionByUserId(Long userId) ;
	
	
	
    public void cacheUserPersionByUserByUserName(String userName) ;
    
    public List<User> selectUserByUpdateTime(String updateTime);
    
    
    /***
     * 根据ID获取用户信息,有限从REDIS缓存中读取，如果查不到进行查库
     * @return
     */
    public User getUserById(Long userId);
    
    
    /***
     * 根据用户身份ID获取用户信息，适合场景：查询当前人的店主
     * @param persionId
     * @return
     */
    public User getUserByPersionId(String persionId);

	/**
	 * <dl>
	 * <dt>枚举个角色用户id</dt>
	 * </dl>
	 * @return List<Long>
	 * @author zls
	 * @param userroleids
	 * @date 2018年1月3日 下午7:51:53
	 */
	public List<Long> getUserRoleEnum(long[] userroleids);
	/**
	 * <dl>
	 * <dt>查询用户店主信息</dt>
	 * </dl>
	 * @param userId
	 * @return ResponseUser
	 * @author zls
	 * @date 2018年1月11日 上午11:50:57
	 */
	ResponseUser getStoreUserByUserId(long userId);
	
	/**
	 * <dl>
	 * <dt>根据用户ID缓存用户信息</dt>
	 * </dl>
	 * @param userId
	 * @return ResponseUser
	 * @author zls
	 * @date 2018年1月11日 上午11:50:57
	 */
	public void cacheUserInfoByUserId(Long userId) ;
	
	
	/**
	 * <dl>
	 * <dt>根据USERID从缓存中查询用户USER_INFO信息</dt>
	 * </dl>
	 * @param userId
	 * @return UserInfo
	 * @author zyf
	 * @date 2018年1月11日 上午11:50:57
	 */	
	public UserInfo selectUserInfoFormCacheByUserId(Long userId);
	
	
	
	/**
	 * <dl>
	 * <dt>根据roleId从缓存中查询出用户角色信息</dt>
	 * </dl>
	 * @param roleId
	 * @return CRole
	 * @author zyf
	 * @date 2018年1月11日 上午11:50:57
	 */	
	public CRole selectCRoleFormCacheByUserId(Integer roleId);
	
	/**
	 * <dl>
	 * <dt>查询用户信息从缓存中查询</dt>
	 * </dl>
	 * @param userId ：用户ID
	 * @return ResponseUser
	 * @author zyf 
	 * @date 2018年1月11日 上午11:50:57
	 */
	public ResponseUser selectUserRoleFormCacheById(long userId);
	/**
	 * @Description: 查询店主对应的所有子下属用户信息
	 * @Author: zhangrenjie
	 * @Date: 2018/1/22 9:56
	 *
	 */
	public List<User> getUserListByRecommendFrom(String persionId);


	
	
	/**
	 * <dl>
	 * <dt>缓存所有系统角色信息</dt>
	 * </dl>
	 * @return ResponseUser
	 * @author zyf
	 * @date 2018年1月11日 上午11:50:57
	 */
	public void cacheUserRoleInfo() ;
	
	
	/**
	 * <dl>
	 * <dt>根据用户ID缓存用户信息，和用户INFO信息，在用户登录的时候进行异步缓存</dt>
	 * </dl>
	 * @return 
	 * @author zyf
	 * @date 2018年1月11日 上午11:50:57
	 */
	public void cacheUser(Long userId);
}

